<?php
namespace di;
class Container{
    
    /**
     * 存放容器的数据
     */
    public $instances=[];

    /**
     * 容器中的对象实例
     */
    protected static $instance;

    private function __construct(){
    }

    public static function getInstance(){ //单例模式获取对象
        if(is_null(static::$instance)){
            static::$instance=new static;
        }
        return static::$instance;
    }

    public function set($key,$value){
        $this->instances[$key]=$value;
    }

    /**
     * 获取容器里的实例 会用到反射机制
     */
    public function get($key){

        if(!empty($this->instances[$key])){
            $key=$this->instances[$key];
        }
        
        $reflect=new \ReflectionClass($key);
        
        $c=$reflect->getConstructor(); //获取类的构造函数
        if(!$c){
            return new $key;
        }
        $params=$c->getParameters(); //返回构造函数参数
        
        if(empty($params)){ //有构造函数，构造函数无参数
            return new $key;
        }
        foreach ($params as $key => $param) {
            $class=$param->getClass();
            if(!$class){
                //todo
            }else{
                $args[]=$this->get($class->name);
            }
            return $reflect->newInstanceArgs($args);
        }
    }
}